#ifndef OPERATION_H
#define OPERATION_H

#include <string>
#include <vector>
class Operation{
public:
    using ParamSet = std::vector<std::string>;

    Operation(){}

	Operation(const std::string &n, const ParamSet &p): name(n), paramSet(p){}
    //接受通用引用作为参数，为了使得它接受[常量字符串,C风格字符串，右值,将被移动的对象]作为参数时提高性能。勿重载
    // template<typename name_t, typename paramSet_t>
    // Operation(name_t &&n, paramSet_t &&params)
            // : name(std::forward<name_t>(n)), paramSet(std::forward<paramSet_t>(params)) {
        // 编译期检查。保证接受的参数能够用于构造。
        // static_assert(
                // std::is_constructible<std::string, name_t>::value && std::is_constructible<ParamSet, paramSet_t>::value,
                // "name and params are not competent to construct a Operation.");
    // }

    //接受通用引用作为参数，为了使得它接受[常量字符串，C风格字符串，右值,将被移动的对象]作为参数时提高性能。勿重载
    template<typename T>
    void add(T &&param) {
        static_assert(std::is_constructible<std::string, T>::value,
                      "name and params are not competent to construct a Operation.");
        paramSet.emplace_back(std::forward<T>(param));
    }

    const ParamSet &getParams() const { return paramSet; }

    const std::string &getName() const { return name; }

private:
    std::string name;
    ParamSet paramSet;
};

#endif
